
// type EqpSort = "21" | "22" | "41" | "42" | "43";
//type SupportedMenuLinkComponent = object | keyof JSX.IntrinsicElements;
// type RepTypeConfig = {
//     gray: EqpSort;
// };

/** 具体配置：需要考虑到逻辑上的包含关系，避免有冗余配置项。
 五个选择项，全部都得填充。二维数组形式的，内层数组5项目 按顺序如下:
  EQP_SORT" "设备种类"   若==''表示不关心设备品种，都能用。
 EQP_VART" "设备品种"   若==''表示不关心设备品种，都能用。
 SUB_EQP_VART"  "子设备品种",   若==''表示不关心子设备品种，都能用。
 "OPE_TYPE", "业务类型",  必须选定一个特定的类型！ 单票否决的：业务类型必须完全一致，业务类型也不可省略。
 #是法定的才能用?， false=委托才能用， true=法定才能用，若填上==null=兼容都可用。
 ['41','413','9999','REGUL',null]
 $ 使用场景：是否属于主报告的报告模板类型,可以当做主报告使用，只能用于分项报告情况。 独立主报告，分项报告，主报告必须融合分项报告，分项报告必须依附主报告。
 可以当成分项还是可以当成主报告来做的？审核人可以检查的吧。没有必要在这里配置选择项的？。
* */

const ModelMapConfig = {
    "EL-DJ": [
        ['41','413','9999','REGUL',null], ['','','','REGUL',false]
    ],
    "EL-JJ": [
        ['41','413','','INSTA',false], ['41','','','INSTA',true]
    ],
    'EL-DJ-XSQ': [
        ['41','413','','REGUL',false], ['41','413','9999','REGUL',true]
    ],
}



// type TwoDimensionCfg = typeof ModelMapConfig["EL-DJ"];

//ES6 Generator 函数, 为不具备 Iterator 接口的对象提供遍历方法。   https://www.runoob.com/w3cnote/es6-generator.html
function* entries(obj :any) {
    //const propKeys = Reflect.ownKeys(obj);返回对象所有的属性，不管属性是否可枚举，包括 Symbol。
    for (let key of Object.keys(obj)) {
        yield [key, obj[key]];
    }
}

/**根据设备类别和业务类型性质来搜索可能使用的报告模板类型的列表。
 * 输出有顺序的：匹配最佳的放在[0]第一位上。
 * */
export function getReportModelTypes(
    vart: string,sort: string,subvart: string,bsType: string,entrust:boolean
): string []
{
    let mac2bind=[] as  [string,number][];     //前面放入报告模板编号，后面放入匹配程度等级；
    /*for (var key of Object.keys(someObject)) {
        console.log(key + ': ' + someObject[key]);
      }   */
    let m=0;
    //是否满足，最大的满足程度 0，1，，，，4个条件都满足的。  ==0不满足删除。
    for (let [key, value] of entries(ModelMapConfig)) {
        let matched=0;      //配对等级 程度好的
        for (const gz of value) {         //value[ [], ]可以用这个模板的条件，多个 gz1 or gz2 or ...
            let oneok=0;
            if(gz[3]!==bsType)   continue;
            if(null===gz[4] || (false===gz[4] && entrust) || (true===gz[4] && !entrust) ) {
                //剩下就是设备分类的匹配
                if (!gz[0]) {         //任意vart的设备？最宽松条件了；
                    if (matched <= 0)   matched = 1;
                    continue;
                } else if (gz[0] === vart) {
                    if (!gz[1]) {         //任意sort的设备
                        if (matched <= 1)   matched = 2;
                        continue;
                    }else if (gz[1] === sort) {
                        if (!gz[2]) {         //任意subvart的设备
                            if (matched <= 2)   matched = 3;
                            continue;
                        }else if (gz[2] === subvart) {
                            matched = 4;
                        }
                    }
                }
            }
            if(matched>= 4)     break;      //最高可能的等级
        }
        if(matched>0)
            mac2bind[m++] = [key, matched];
    }
    //必须interface Array<T> 才能用的sort()操作
    mac2bind.sort(function(a, b) {
        if (a[1] > b[1]) {        //比较位于[,]第二个的等级即可
            return  -1     //返回，a排列在b之前
        } else {
            return  1      //返回，b排列在a之前
        }
    });
    return  mac2bind.map(one=>one[0]);
}
